查看原文
其他

什么?你了解二手车市场?(含爬虫代码)

2017-10-08 刘顺祥 每天进步一点点2015

往期回顾

从零开始学Python【15】--matplotlib(散点图)

从零开始学Python【14】--matplotlib(折线图)

从零开始学Python【13】--matplotlib(直方图)

从零开始学Python【12】--matplotlib(箱线图)

从零开始学Python【11】--matplotlib(饼图)

从零开始学Python【10】--matplotlib(条形图)


前言


       我们已经学习了使用Python的matplotlib模块进行数据的可视化,包括绘制条形图、饼图、箱线图、直方图、折线图和散点图。学习了就要学会去使用它,我们就通过一个二手车的案例来练一下手,在练之前,是不是得先有数据呀。没问题,我们就使用Python这个神器先来抓取某二手车平台的数据—爬虫。在今天的这篇文章中,我们就来详细的讲讲如何从这个网络平台上获取数据。

爬虫思路


       先来看几张截图,然后基于这个截图再来介绍在整个爬虫中需要经过的步骤:

  • 在这个二手车主页中,只显示了50页,以每页50辆车来算,顶多只能抓取2500辆二手车的信息。为了能够尽可能的抓取更多的二手车信息,我们对二手车的各个品牌按字母展开,如上图所示。所以,在这一步中,我们需要获取各品牌二手车的链接URL;


  • 以奥迪品牌为例,我们需要知道这种品牌的二手汽车大概有多少辆,说白了就是要获取奥迪二手车一共有多少页信息。所以,我们需要获取各个品牌车辆各有多少页,然后再根据页数生成要抓取的链接URL;


  • 有了这些个URL,就可以根据URL的内容,获取每一辆车的上牌时间、表显里程等指标数据;


  • 最后需要将搜集来的数据进行存储,本例中我们就将数据存放到csv文件中,如下图所示。


       接下来,我们就根据上面的四个步骤,展开某二手车平台数据的搜集。


步骤一、获取各品牌二手车的链接URL


       我们来到二手车的主页,并按下电脑的F12键,根据下图框出来的1,2,3几个步骤,就可以获取4的结果。


  • 说明:

红框1:点击品牌末尾的更多,会展现一排因为字母,这线字母全都是汽车品牌的首字母拼音;

红框2:点击类似鼠标的按钮,可以帮助你锁定接下来需要选择的内容包含在什么标记中;

红框3:点击“奥迪”品牌为例;

红框4:点击之后,就会锁定该“奥迪”所在网页源代码中的位置和所属标记。

代码实现:

# 导入第三方包
import requestsfrom bs4
import BeautifulSoup
import time

# 设置伪头--用于防止反爬虫

headers = {'Accept':'*/*',
           'Accept-Encoding':'gzip, deflate, br',
           'Accept-Language':'zh-CN,zh;q=0.8',
           'Connection':'keep-alive',
           'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
           
# 二手车主页的链接
url = 'http://shanghai.taoche.com/all/'

# 发送抓取链接的请求并进一步解析
res = requests.get(url, headers = headers).text soup = BeautifulSoup(res,'html.parser')

# 抓取二手车品牌名称及对应的链接
car_brands = soup.findAll('div',{'class':'brand-name'})
# 根据HTML的标记搜索指定对象
car_brands = [j for i in car_brands for j in i] # 双重for循环的列表解析式
brands = [i.text for i in car_brands] # 去标签化处理

urls = ['http://shanghai.taoche.com' + i['href'] for i in car_brands] # 拼接完整的二手车品牌链接


步骤二、生成所有需要抓取的链接URL


       根据第一步获取的urls,即各个品牌的第一页链接,接下来需要把各品牌的所有页面的链接全部解析出来。以奥迪品牌的url为例,根据下图的1,2几个步骤获取每个品牌的总页数。


  • 说明:

红框1:在奥迪的主页下,按F12键,并点击类似鼠标箭头的按钮,用于抓捕点击行为;

红框2:点击页码“15”,查看页码对应的HTML标记,用于解析总页数这个值;

红框3:点击后,就会返回“15”所在网页源代码中的位置和所属标记;

代码实现:

# 构建空的列表,用于存放品牌的所有链接和品牌名称
target_urls = [] target_brands = []

# 通过for循环完成网页的解析,并生产链接
for b,u in zip(brands,urls):    
   # 抓取各品牌二手车主页下的所有页码    res = requests.get(u, headers = headers).text    soup = BeautifulSoup(res,'html.parser')  
    
   # 查询出页数    if len(soup.findAll('div',{'class':'the-pages'})) == 0:        pages = 1    else:        pages = int([page.text for page in soup.findAll('div',{'class':'the-pages'})[0].findAll('a')][-2])    
   
   # 为了防止反爬虫,这里每循环一次休眠3秒钟    time.sleep(3)    
   
   # 将链接存储起来    for i in range(1,pages + 1):        target_brands.append(b)        target_urls.append(u+'?page='+str(i)+'#pagetag')


步骤三、所有目标链接的数据抓取


       第二步已经获取了所有目标链接(一共308条),接下来需要针对这些链接,进行目标数据的抓取,包括二手车的上牌时间、表显里程、排放标准、二手价等信息。以“奥迪A6 2013款 40 hybrid”为例,根据下图的1,2几个步骤获取每个二手车的详细数据:


  • 说明:

红框1:在奥迪的主页下,按F12键,并点击类似鼠标箭头的按钮,用于抓捕点击行为;

红框2:点击标题“奥迪A6 2013款 40 hybrid”,查看页码对应的HTML标记;

红框3:点击后,就会返回该标题所在网页源代码中的位置和所属标记;

       上图所示,源代码中的红框abc对应了前端显示的ABC内容,这样就可以借助已知的标记解析出想要的数据内容,具体可以查看下面的代码。

代码实现:

# 构建空列表,用于数据的存储brand = [] title = [] boarding_time = [] km = [] discharge = [] sec_price = [] new_price = []

# 对每个链接发送请求
for b,u in zip(target_brands,target_urls):    res = requests.get(u, headers = headers).text    soup = BeautifulSoup(res,'html.parser')    

   # 统计每页二手车的数量    N = len([i.findAll('a')[0]['title'] for i in soup.findAll('div',{'class':'item_details'})])    
   
   # 为防止报错,这里借用异常值处理办法    try:        
       # 二手车的品牌        brands = (b+'-')*N        brand.extend(brands.split('-')[:-1])        
       
       # 二手车的名称        title.extend([i.findAll('a')[0]['title'] for i in soup.findAll('div',{'class':'item_details'})])        
       
       # 二手车的上牌时间、行驶里程数等信息        info = [i.findAll('li') for i in soup.findAll('ul',{'class':'ul_news'})]        boarding_time.extend([i[0].text[4:] for i in info])        km.extend([i[1].text[4:] for i in info])        
       
       # 二手车的排量标准        discharge.extend([i[3].text[4:] for i in info])        
       
       # 二手车的价格        sec_price.extend([float(i.findAll('h2')[0].text[:-1]) for i in soup.findAll('div',{'class':'item_price'})])        
       
       # 新车的价格        new_price.extend([i.findAll('p')[0].text.split('\xa0')[0][5:].strip() for i in soup.findAll('div',{'class':'item_price'})])    
       
   except IndexError:        print('索引错误')    
   
   # 每3秒休眠一次    time.sleep(3)


步骤四、数据的存储


       上面的三个步骤大约需要15分钟左右的运行时间,之后在电脑的内存中就会存储11,281条二手车的数据信息,如果不对这些数据的存储,一旦关闭Python的会话窗口,数据就会丢失。所以,有必要将这些数据存储到本地或数据库,这里就是要pandas模块,将数据存储到csv文件中。

代码实现:

# 数据导出
import pandas as pd

# 先转化为数据框(记得转置)
cars_info = pd.DataFrame([brand,title,boarding_time,km,discharge,sec_price,new_price]).T

# 数据框变量的重命名
cars_info = cars_info.rename(columns={0:'Brand',
                                     
1:'Name',
                                     2:'Boarding_time',
                                     3:'Km',
                                     4:'Discharge',
                                     5:'Sec_price',
                                     6:'New_price'})

# 数据的写出操作
cars_info.to_csv('second_cars_info.csv', index=False)


结语


       OK,今天的内容就是手把手地教你使用Python对某二手汽车平台进行爬虫,相信经过以上的操作,你应该明白爬虫的思路和步骤了吧,如果有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和动手操作。最后,本文相关的Python脚本和PDF版本已存放到百度云盘,可以通过下面的链接获取

链接: https://pan.baidu.com/s/1dFapkdV 密码: 9qv4

                                            每天进步一点点2015

学习与分享,取长补短,关注小号!


长按识别二维码 马上关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存